昨天提到消除冗余條件的原理,實際應用時會有一點變化,今天就來看看吧。
在這個例子中,order == null 已經在第一個 if 判斷過,並在符合條件時 Early Return 出去了。因此 Rider 判斷在第二個 if 時,永遠不會成立。
按下 Show Context Actions,選擇 Remove Expression。其實我一直覺得這個訊息不夠明確,沒辦法清除表達「執行後語意不變」的概念,也許改叫 Remove Redundant Expression 會更好。
完成~
在這個例子中,明明內外兩個條件式看起來一樣,但 Rider 並沒有像前一次提示我任何訊息。難道是我看錯了嗎?不知道,我不太相信我的肉眼。看看能不能用其他重構方式來幫我釐清這件事。
我選擇 Introduce Variable,試著請 Rider 幫我將條件式抽取成變數。
Rider 問我:「你要提取的是金色的兩個還是銀色的一個呢?」看來我前面判斷得沒錯,這兩個條件是一樣的,幫我把他們抽成同一個變數吧。
當條件式變簡單後,Rider 輕易就可以判斷出重複。
按下 Show Context Actions,選擇 Replace With 'then result' Expression。這邊即使選擇第二個選項,最終也能達成一樣的結果,只是要花比較多步驟,所以我還是選擇第一個。
成功移除了重複的條件式,但是那個暫時變數看起來有點醜,我打算把它消除掉。
執行 Inline Variable。
完成!
看到這個標題腦中瞬間浮現出頭文字 D 的主題曲 XD。
看看這個例子,單純從字串比對上,這裡並沒有任何的重複,Rider 也沒有任何提示。但第一個 if 的 order.Items.Length <= 0 和第二個 if 的 order.Items.Length > 0 看起來超有關係的。可是經歷了多次把 if 改壞的慘劇,在沒有測試或工具幫助的情況下,我真的不敢直接修改條件式。
為了讓兩個條件式長成一樣,我選擇 Replace '&&' With '||',Rider 會幫我用 De Morgan's laws 來將它反轉。
Ok,重複出現了。但這對 Rider 來說似乎仍偏複雜,它仍然沒有給我任何提示。
這時若像前面一樣直接抽取變數,會變成像這樣,微微地改變語意。這是 Rider 的限制,來看看有沒有辦法繞開。
我先用 Split 'if' 把它拆開。
變這樣。
接著再執行 Introduce Variable,這邊直接跳到結果。
可以看到變成簡單條件式後,Rider 終於給出了提示。
接著執行 Remove Expression。
再執行 Remove Redundant Parentheses。
已經很接近了。
執行 Inline Variable 後,就算是告一個段落了。步驟有點多,但最終還是成功移除了重複的條件式。
要判斷冗余條件式,並不是一個很簡單的事情,即使是 Rider 也有它的極限在,但我們仍能透過很多不同的方式來跟 Rider 互動,進而成功執行任務。值得一提的是,所有的操作從頭到尾都沒有打過一行 code。這就是自動重構工具的魅力!